/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.io.Serializable;
import java.util.ArrayList;
import mensaje.Usuario;
import mensaje.Texto;
import mensaje.UserDestino;
import mensaje.Correo;
import mensaje.Message;
import listas.ListaMensajesRecibidos;
import mensaje.EstadoMensaje;
import server.MailServer;

/**
 * ServerClient es una clase que intancia a las clases ListaMensajesRecibidos y MailServer
 * para interactuar con la clase MailClient.
 * @author zulema
 * @version 1.1.1
 */
public class ServerClient implements Serializable{
    private ListaMensajesRecibidos MensajesRecibidos;
    private MailServer mailServer;
/**
 * Constructor de la clase ServerClient recibe como parametros el servidor al cual se conecta el cliente que tambien es pasado como parametro
 * @param mailServer
 * @param mailClient 
 */
    public ServerClient(MailServer mailServer, MailClient mailClient ) {
        this.mailServer=mailServer;
        this.mailServer.addMailClient(mailClient);
        String nombreUsuario = mailClient.obtenerUsuario();
        ArrayList<Message> mensajesUsuario = this.mailServer.obtenerMensajesUsuario(nombreUsuario);
        this.MensajesRecibidos=new ListaMensajesRecibidos(mensajesUsuario);
        //actualizando el estado de los mensajes que se recuperan, solo los que estaban en espera.
        ArrayList<Message> mensajesActualizar = MensajesRecibidos.listarMensaje();
        for (int i = 0; i < mensajesActualizar.size(); i++) {
            Message mensaje = mensajesActualizar.get(i);
            if (mensaje.obtenerEstadoMensaje().equals("En espera")) {
                mensaje.cambiarEstadoMensaje(2);
            }            
        }
    }
    
/**
 * Metodo que consulta al servidor la cantidad de mensajes
 * @param usuario del cual se va a recuperar el numero de mensajes
 * @return int Un entero que es el resultado de la cantidad de mensajes que 
 * tiene el usuario.
 */
    public int numeroMensajes(String usuario){
    return mailServer.getMessagesWaiting(usuario);
    }
/**
 * Método que obtiene el siguiente mensaje del servidor y lo almacena en sus 
 * mensajes recibidos.
 * @param usuario El parametro usuario define el nombre del usuario de correo.
 * @return Message Un objeto Messaje que es el mensaje del usuario de correo.
 */   
    public Message nexMessage(String usuario){
        Message recibido=mailServer.getNextMessage(usuario);
        MensajesRecibidos.agregarMensaje(recibido);
        
        return recibido;
    }
/**
 * Metodo que envia un mensaje al servidor enviando como parametros:
 * @param sender usuario que envia el mensaje
 * @param destinatario usuario que recibe el mensaje
 * @param asunto asunto del correo
 * @param mensaje mensaje del corrreo
 */    
    public void sendMessage(String sender, String destinatario, String asunto, String mensaje){
        UserDestino userDestino=new UserDestino(new Usuario(sender), new Usuario(destinatario));
        Correo correo=new Correo(new Texto(asunto), new EstadoMensaje(new Texto(mensaje),1));
        Message msj = new Message(userDestino, correo);
        mailServer.post(msj);
    }
    /**
     * Metodo que obtiene una lista de los mensajes del cliente
     * @return  ArrayList<Message>
     */
    
    public ArrayList<Message> listarMensajes(){
        return MensajesRecibidos.listarMensaje();
    }
    /**
     * Metodo que elimina un mensaje del MailServer y de la lista de mensajes del cliente.
     * @param mensaje de tipo Message que sera eliminado.
     */
    public void eliminarMensajes(Message mensaje){
        MensajesRecibidos.eliminarMensaje(mensaje);
        mailServer.eliminarMensaje(mensaje);
    }
    /**
     * Metodo que cambia el estado del mensaje pasado por parametro a "leido".
     * @param mensaje al cual se le cambiara el estado.
     */
    public void marcarMensaje(Message mensaje){
        mensaje.cambiarEstadoMensaje(3);
    } 
    /**
     * Metodo que instancia a la autenticacion de usuario del servidor.
     * @param usuario nombre del usuario que sera validado.
     * @return 
     */
    public boolean autenticarUsuario(String usuario){
        return mailServer.usuarioValido(usuario);
    }
}
